package ar.edu.unicen.exa.isistan.archassis.classreader;

import java.util.ArrayList;
import java.util.List;

public class CanonicalClassNameResolver {

	private static List<String> importDefault;
	static {
		importDefault = new ArrayList<String>();
		importDefault.add("java.lang.String");
		importDefault.add("long");
		importDefault.add("int");

	}

	private String javaClass_name;
	private String javaClass_belongsToPackage;
	private List<String> javaClass_rnImports;

	/**
	 * Heuristica para obtener el nombre completo de una clase, dado informacion sobre donde se encuentra.
	 * 
	 * @param javaClass_name nombre de la clase contenedora.
	 * @param javaClass_belongsToPackage paquete al que pertenece la clase contenedora.
	 * @param javaClass_rnImports imports que realiza la clase contenedora.
	 * 
	 */
	public CanonicalClassNameResolver(String javaClass_name, String javaClass_belongsToPackage, List<String> javaClass_rnImports) {
		this.javaClass_name = javaClass_name;
		this.javaClass_belongsToPackage = javaClass_belongsToPackage;
		this.javaClass_rnImports = javaClass_rnImports;
	}

	public List<String> resolve(List<String> classNames) {
		List<String> result = new ArrayList<String>();
		for (String className : classNames) {
			result.add(resolve(className));
		}
		return result;
	}
	/**
	 * @param className nombre de la clase a traducir.
	 * @return el nombre canonico
	 */
	public String resolve(String className) {
		//si la clase a traducir se llama igual que la clase contenedora...
		if (javaClass_name.equals(className)) {
			return javaClass_belongsToPackage + "." + javaClass_name;
		}
		//si son clases de utilidades como String, long, etc
		for (String importItem : importDefault) {
			if (importItem.endsWith("." + className)) {
				return importItem; 
			} else if (importItem.equals(className)) {
				return importItem;
			}
		}

		//si alguno de los imports termina con el nombre de la clase...
		for (String importItem : javaClass_rnImports) {
			if (importItem.endsWith("." + className)) {
				return importItem; 
			} else if (importItem.equals(className)) {
				return importItem;
			}
		}

		StringBuffer result = null;
		for (String importItem : javaClass_rnImports) {
			if (importItem.endsWith(".*")) { //TODO ver si queremos eliminar el *
				if (result == null) {
					result = new StringBuffer(importItem);
				} else {
					result.append(",").append(importItem);
				}
				result.append(className);
			}
		}

		if (result != null) {
			return result.toString();
		}
		return className;
	}
}
